<?php
/**
 * 유틸리티 - XSS Filter
 *
 * 이 유틸리티는 HTTP의 요청에 대한 모든 잠재적인 HTML 위험요소에 대해 제거합니다.
 *
 * 예를들어, $aPost = array('test'=>'<script></script>'); 에서  $aPost에 대한 잠재적인 위험요소를 제거하려면 아래 코드를 시행하십시오.
 *
 * $filPost = new utilXss($aPost);
 * $sHTML = $filPost->filterHTML('test');
 *
 * XSS Filter는 HTML, 문자열(알파벳,숫자,_,공백,일반적으로 안전한 문자열 등), Float, Int, Path 및 FileName 에 대한 Filter를 제공합니다.
 *
 * <code>
 * // 생성자에 데이터 배열이 입력되지 않으면 기본적으로 $_REQUEST가 선택됩니다.
 * $utilXss = new utilXss();
 * $sString = $utilXss->filter('sKey');
 *
 * or
 *
 * $utilXss = new utilXss($_POST);
 * $sString = $utilXss->filter('sKey');
 * </code>
 *
 * @package util
 *
 * @author jylee3@simplexi.com
 * @version 1.0
 */
class utilXss
{
    /**
     * XSS Filter Utility Instance
     *
     * <code>
     * $utilXss = utilXss::getInstance();
     * $sString = $utilXss->filter('sKey');
     * </code>
     *
     * @param    Array    $aSource    필터 대상
     * @param    Boolean    $bUseDefaultFilter    기본 필터 실행여부, 기본 필터 실행시 true, 실행하지 않을경우 false
     *
     * @return    utilXss
     */
    public static function getInstance($aSource=null, $bUseDefaultFilter=true)
    {
        if (is_null($aSource)) $aSource = $_REQUEST;

        return new self($aSource, $bUseDefaultFilter);
    }

    /**
     * Filter Data
     * @var Array
     */
    protected $aSource;

    /**
     * Default Filtering Use
     * @var Boolean
     */
    protected $bUseDefaultFilter;

    /**
     * XSS Filter Instance
     *
     * <code>
     * $utilXss = new utilXss($_POST);
     * </code>
     *
     * @param    Array    $aSource    필터 대상
     * @param    Boolean    $bUseDefaultFilter    기본 필터 실행여부, 기본 필터 실행시 true, 실행하지 않을경우 false
     */
    public function __construct($aSource, $bUseDefaultFilter=true)
    {
        $this->aSource = $aSource;
        $this->bUseDefaultFilter = $bUseDefaultFilter;

        if($this->bUseDefaultFilter!==false)    $this->defaultFilter($this->aSource);
    }

    /**
     * Getting... Source Data
     *
     * <code>
     * $utilXss = new utilXss($_POST);
     * $aSource = $utilXss->getSource();
     * </code>
     *
     * @param    Boolean    $bDefaultFilter    기본 필터 실행여부, 기본 필터 실행시 true, 실행하지 않을경우 false
     *
     * @return    Array    필터 대상
     */
    public function getSource($bDefaultFilter=true)
    {
        if (($bDefaultFilter!==false) && ($this->bUseDefaultFilter===false)) {
            $this->defaultFilter($this->aSource);
        }

        return $this->aSource;
    }

    /**
     * Init. Default Filtering..
     *
     * @param    Mixed    $mData
     *
     * @return    void
     */
    public function defaultFilter(&$mData, $sReplaceString='!!XSS!!')
    {
        if (is_array($mData) && !empty($mData)) {
            foreach ($mData as &$mValue) {
                if (is_array($mValue)) {
                    $this->defaultFilter($mValue, $sReplaceString);
                } else {
                    if (is_string($mValue)) {
                        $mValue = utilXssDefault::filter($mValue, $sReplaceString);
                    }
                }
            }
        }
    }

    /**
     * Default Filter
     *
     * <code>
     * $utilXss = new utilXss($_POST);
     * $mVal = $utilXss->filter('sKey');
     * </code>
     *
     * @param    String    $sKey    필터 대상 키
     * @param    String    $sReplaceString    변환 문자열
     *
     * @return    String    필터 결과 문자열
     */
    public function filter($sKey, $sReplaceString='!!XSS!!')
    {
        if (!isset($this->aSource[$sKey]))    return false;

        return ($this->bUseDefaultFilter===false)?
            utilXssDefault::filter($this->aSource[$sKey], $sReplaceString) : $this->aSource[$sKey];
    }

    /**
     * HTML Filter
     *
     * <code>
     * $utilXss = new utilXss($_POST);
     * $sHtml = $utilXss->filterHTML('sKey');
     * </code>
     *
     * @param    String    $sKey    필터 대상 키
     * @param    Array    $aAllowTag    허용할 태그의 배열
     *
     * @return    String    필터 결과 HTML
     */
    public function filterHTML($sKey, $aAllowTag=array())
    {
        if (!isset($this->aSource[$sKey]))    return false;

        return utilXssHtml::filter($this->aSource[$sKey], $aAllowTag);
    }

    /**
     * Integer Filter
     *
     * <code>
     * $utilXss = new utilXss($_POST);
     * $iInt = $utilXss->filterInt('sKey');
     * </code>
     *
     * @param    String    $sKey    필터 대상 키
     *
     * @return    Integer    필터 결과 값
     */
    public function filterInt($sKey)
    {
        if (!isset($this->aSource[$sKey]))    return false;

        return utilXssVar::filterInt($this->aSource[$sKey]);
    }

    /**
     * Float Filter
     *
     * <code>
     * $utilXss = new utilXss($_POST);
     * $iFloat = $utilXss->filterFloat('sKey');
     * </code>
     *
     * @param    String    $sKey    필터 대상 키
     *
     * @return    Float    필터 결과 값
     */
    public function filterFloat($sKey)
    {
        if (!isset($this->aSource[$sKey]))    return false;

        return utilXssVar::filterFloat($this->aSource[$sKey]);
    }

    /**
     * Alphabetics Filter
     *
     * <code>
     * $utilXss = new utilXss($_POST);
     * $sString = $utilXss->filterAlpha('sKey');
     * </code>
     *
     * @param    String    $sKey    필터 대상 키
     * @param    Integer    $iMaxLength    최대 길이, -1 이면 제한 없음(기본값)
     *
     * @return    String    필터 결과 문자열
     */
    public function filterAlpha($sKey, $iMaxLength=-1)
    {
        if (!isset($this->aSource[$sKey]))    return false;

        return utilXssVar::filterAlpha($this->aSource[$sKey], $iMaxLength);
    }

    /**
     * FileName Filter
     *
     * <code>
     * $utilXss = new utilXss($_POST);
     * $sString = $utilXss->filterAlpha('sKey');
     * </code>
     *
     * @param    String    $sKey    필터 대상 키
     * @param    Integer    $iMaxLength    최대 길이, -1 이면 제한 없음(기본값)
     *
     * @return    String    필터 결과 문자열
     */
    public function filterFileName($sKey, $iMaxLength=-1)
    {
        if (!isset($this->aSource[$sKey]))    return false;

        return utilXssVar::filterFileName($this->aSource[$sKey], $iMaxLength);
    }

    /**
     * Direcotry Path Filter
     *
     * <code>
     * $utilXss = new utilXss($_POST);
     * $sString = $utilXss->filterAlpha('sKey');
     * </code>
     *
     * @param    String    $sKey    필터 대상 키
     * @param    Integer    $iMaxLength    최대 길이, -1 이면 제한 없음(기본값)
     *
     * @return    String    필터 결과 문자열
     */
    public function filterPath($sKey, $iMaxLength=-1)
    {
        if (!isset($this->aSource[$sKey]))    return false;

        return utilXssVar::filterPath($this->aSource[$sKey], $iMaxLength);
    }

    /**
     * Alphabetics and Space[ ] Filter
     *
     * <code>
     * $utilXss = new utilXss($_POST);
     * $sString = $utilXss->filterAlpha('sKey');
     * </code>
     *
     * @param    String    $sKey    필터 대상 키
     * @param    Integer    $iMaxLength    최대 길이, -1 이면 제한 없음(기본값)
     *
     * @return    String    필터 결과 문자열
     */
    public function filterAlphaSpace($sKey, $iMaxLength=-1)
    {
        if (!isset($this->aSource[$sKey]))    return false;

        return utilXssVar::filterAlphaSpace($this->aSource[$sKey], $iMaxLength);
    }

    /**
     * Alphabetics and Number Filter
     *
     * <code>
     * $utilXss = new utilXss($_POST);
     * $sString = $utilXss->filterAlpha('sKey');
     * </code>
     *
     * @param    String    $sKey    필터 대상 키
     * @param    Integer    $iMaxLength    최대 길이, -1 이면 제한 없음(기본값)
     *
     * @return    String    필터 결과 문자열
     */
    public function filterAlphaNum($sKey, $iMaxLength=-1)
    {
        if (!isset($this->aSource[$sKey]))    return false;

        return utilXssVar::filterAlphaNum($this->aSource[$sKey], $iMaxLength);
    }

    /**
     * Alphabetics and Number and Space[ ] Filter
     *
     * <code>
     * $utilXss = new utilXss($_POST);
     * $sString = $utilXss->filterAlpha('sKey');
     * </code>
     *
     * @param    String    $sKey    필터 대상 키
     * @param    Integer    $iMaxLength    최대 길이, -1 이면 제한 없음(기본값)
     *
     * @return    String    필터 결과 문자열
     */
    public function filterAlphaNumSpace($sKey, $iMaxLength=-1)
    {
        if (!isset($this->aSource[$sKey]))    return false;

        return utilXssVar::filterAlphaNumSpace($this->aSource[$sKey], $iMaxLength);
    }

    /**
     * Alphabetics and Number and Underline[_] Filter
     *
     * <code>
     * $utilXss = new utilXss($_POST);
     * $sString = $utilXss->filterAlpha('sKey');
     * </code>
     *
     * @param    String    $sKey    필터 대상 키
     * @param    Integer    $iMaxLength    최대 길이, -1 이면 제한 없음(기본값)
     *
     * @return    String    필터 결과 문자열
     */
    public function filterAlpha_Num($sKey, $iMaxLength=-1)
    {
        if (!isset($this->aSource[$sKey]))    return false;

        return utilXssVar::filterAlpha_Num($this->aSource[$sKey], $iMaxLength);
    }

    /**
     * Alphabetics and Number and Underline[_] and Space[ ] Filter
     *
     * <code>
     * $utilXss = new utilXss($_POST);
     * $sString = $utilXss->filterAlpha('sKey');
     * </code>
     *
     * @param    String    $sKey    필터 대상 키
     * @param    Integer    $iMaxLength    최대 길이, -1 이면 제한 없음(기본값)
     *
     * @return    String    필터 결과 문자열
     */
    public function filterAlpha_NumSpace($sKey, $iMaxLength=-1)
    {
        if (!isset($this->aSource[$sKey]))    return false;

        return utilXssVar::filterAlpha_NumSpace($this->aSource[$sKey], $iMaxLength);
    }

    /**
     * Alphabetics or Number Filter
     *
     * <code>
     * $utilXss = new utilXss($_POST);
     * $sString = $utilXss->filterAlpha('sKey');
     * </code>
     *
     * @param    String    $sKey    필터 대상 키
     * @param    Integer    $iMaxLength    최대 길이, -1 이면 제한 없음(기본값)
     *
     * @return    String    필터 결과 문자열
     */
    public function filterAlphaOrNum($sKey, $iMaxLength=-1)
    {
        if (!isset($this->aSource[$sKey]))    return false;

        return utilXssVar::filterAlphaOrNum($this->aSource[$sKey], $iMaxLength);
    }

    /**
     * String Filter
     *
     * <code>
     * $utilXss = new utilXss($_POST);
     * $sString = $utilXss->filterAlpha('sKey');
     * </code>
     *
     * @param    String    $sKey    필터 대상 키
     * @param    Integer    $iMaxLength    최대 길이, -1 이면 제한 없음(기본값)
     *
     * @return    String    필터 결과 문자열
     */
    public function filterString($sKey, $iMaxLength=-1)
    {
        if (!isset($this->aSource[$sKey]))    return false;

        return utilXssVar::filterString($this->aSource[$sKey], $iMaxLength);
    }
}
